home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Games / Tetris Light 1.0.2 / source / env.c < prev    next >
Text File  |  1996-01-04  |  5KB  |  169 lines

  1. /* ----------------------------------------------------------------------
  2. File: env.c
  3.  
  4. Purpose:    This module provides routines to determine the facilities
  5.             available on the running machine. These routines provide
  6.             glue to work on all Macintoshes (including the original
  7.             128K Mac). The implementation does not rely on any 
  8.             compiler supplied glues.
  9.             
  10. Tetris Light - a simple implementation of a Tetris game
  11. Copyright (C) 1993-1995 Hoylen Sue
  12.  
  13. Updated for CW7 on 951215 by Paul Celestin
  14. Questions about this version should go to me at celestin@celestin.com
  15.  
  16. This program is free software; you can redistribute it and/or modify
  17. it under the terms of the GNU General Public License as published by
  18. the Free Software Foundation; either version 2 of the License, or
  19. (at your option) any later version.
  20.  
  21. This program is distributed in the hope that it will be useful,
  22. but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24. GNU General Public License for more details.
  25.  
  26. You should have received a copy of the GNU General Public License
  27. along with this program; see the file COPYING.  If not, write to the
  28. Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  29. ---------------------------------------------------------------------- */
  30.  
  31. #include "local.h"
  32.  
  33. #include <GestaltEqu.h>
  34. #include <Traps.h>
  35.  
  36. #include "env.h"
  37.  
  38. /*--------------------------------------------------------------------*/
  39.  
  40. /* Local globals - initialized to worst case assumption, but will be
  41.    set up correctly to reflect the machine when `env_init' is called. */
  42.  
  43. static Boolean env_64k_rom = TRUE;
  44. static Boolean env_gestalt_available = FALSE;
  45.  
  46. /*--------------------------------------------------------------------*/
  47.  
  48. static void env_init(void)
  49. /* Set up local globals which indicate whether the machine has 64K ROMs
  50.    and if gestalt is available.  The routines which need this information
  51.    must call this routine before accessing that information.  Calculation
  52.    of these variables is done only once, but this approach simplifies the
  53.    interface to this module, because it requries no explicit
  54.    initialization.  Failure to call this module may result in those
  55.    variables containing default values, which will indicate a very
  56.    limited machine. */
  57. {
  58.     static Boolean initialized = FALSE;
  59.     INTEGER rom_version;
  60.     INTEGER machine;
  61.     
  62.     if (initialized)
  63.         return;
  64.     initialized = TRUE;
  65.     
  66.     /* Check for 64K ROMS. Use Environs since it is available in ALL
  67.        Macintoshes, although it has been replaced by Gestalt. Note that
  68.        this code does not rely on any compiler glues. */
  69.     Environs(&rom_version, &machine);
  70.     if (rom_version >= 0x75)
  71.         env_64k_rom = FALSE;
  72.     
  73.     /* Check for Gestalt facility. Gestalt is never available on
  74.        original 64K ROM machines! */
  75.     
  76.     if (env_64k_rom)
  77.         env_gestalt_available = FALSE;
  78.     else
  79.         env_gestalt_available = env_trap_available(0xA1AD);
  80. }
  81.  
  82. /*--------------------------------------------------------------------*/
  83.  
  84. static INTEGER num_toolbox_traps(void)
  85. /* Returns the size of the toolbox trap dispatch table.  Code from
  86.    Inside Macintosh VI p. 3-8.  InitGraf (0xA86E) is always implemented.
  87.    If the trap dispatch table has more than 0x200 entries, then 0xAA6E
  88.    always points to either unimplemented or something else, but never
  89.    to InitGraf. The 64K roms do not have NGetTrapAddress, but always
  90.    have small dispatch tables.
  91.    Internal routines which call this one must have ensured that the
  92.    `env_64k_rom' variable has been set up correctly. */
  93. {
  94.     if (env_64k_rom ||
  95.         (NGetTrapAddress(_InitGraf, ToolTrap) ==
  96.          NGetTrapAddress(0xAA6E, ToolTrap)))
  97.         return 0x0200;
  98.     else
  99.         return 0x0400;
  100. }
  101.  
  102. Boolean env_trap_available(INTEGER the_trap)
  103. /* Returns TRUE if the given trap is available. Based on code from
  104.    Inside Macintosh VI.  This routine does not rely on any glue, and
  105.    will work on all Macintoshes from the original 128K mac upwards.
  106.    Short circuit calls to this routine by checking for 64K roms first. */
  107. {
  108.     register TrapType tType;
  109.  
  110.     env_init();
  111.     
  112.     if (the_trap & 0x0800) {
  113.         tType = ToolTrap;
  114.         the_trap &= 0x07FF;
  115.         if (the_trap >= num_toolbox_traps())
  116.             the_trap = _Unimplemented;
  117.     }
  118.     else
  119.         tType = OSTrap;
  120.     
  121.     if (env_64k_rom)
  122.         return (GetTrapAddress(the_trap) !=
  123.                 GetTrapAddress(_Unimplemented));
  124.     else
  125.         return (NGetTrapAddress(the_trap, tType) != 
  126.                 NGetTrapAddress(_Unimplemented, ToolTrap));
  127. }
  128.  
  129. /*--------------------------------------------------------------------*/
  130.  
  131. Boolean env_WaitNextEvent_available(void)
  132. /* Determines if `WaitNextEvent' trap is available.  Returns TRUE if it
  133.    is, FALSE if it is not available. */
  134. {
  135.     return env_trap_available(_WaitNextEvent);
  136. }
  137.  
  138. /*--------------------------------------------------------------------*/
  139.  
  140. Boolean env_FindFolder_available(void)
  141. /* Determines if the `Gestalt' trap is available.  Returns TRUE if it
  142.    is, FALSE if it is not available. */
  143. {    
  144.     env_init();
  145.  
  146.     if (env_gestalt_available) {
  147.         LONGINT result;
  148.         
  149.         Gestalt(gestaltFindFolderAttr, &result);
  150.         if (result & (0x0001 << gestaltFindFolderPresent))
  151.             return TRUE;
  152.     }
  153.  
  154.     return FALSE;
  155. }
  156.  
  157. /*--------------------------------------------------------------------*/
  158.  
  159. Boolean env_SndPlay_available(void)
  160. /* Determines if 'SndPlay' is available.  Returns TRUE if it is, FALSE
  161.    if it is not. */
  162. {
  163.     env_init();
  164.     
  165.     return env_trap_available(_SndPlay);
  166. }
  167.  
  168. /*--------------------------------------------------------------------*/
  169.